package gestores;

import java.sql.Timestamp;
import java.util.Iterator;
import java.util.LinkedList;

import agente.AgenteVirtual;
import agente.Sugestao;

import cliente.Cliente;

import utils.Utilities;

import dados.Accao;
import dados.Registo;
import dados.Stock;
import dados.TipoSugestao;

public class GestorTransaccoes {
	
	private Cliente cliente;
	
	public GestorTransaccoes(Cliente cliente) {
		this.cliente = cliente;
	}

	public boolean comprarAccao(Stock stock, int quantidade) {
		Accao novaAccao = new Accao(stock.getNome(), stock.getSigla(), quantidade, stock.getCotacao());
		double valor = novaAccao.getValorAquisicao() * novaAccao.getQuantidade();
		System.out.println("Saldo Jogador: " + cliente.getJogador().getSaldo() + " - Valor Acções: " + valor);

		if (cliente.getJogador().getSaldo() >= valor) {
			LinkedList<Accao> accoes = cliente.getJogador().getAccoes();
			if(cliente.getJogador().getAccoes().contains(novaAccao)){
				Accao a = cliente.getJogador().getAccoes().get(cliente.getJogador().getAccoes().indexOf(novaAccao));
				//				System.out.println(a.getQuantidade());
				a.setValorAquisicao(Utilities.mediaPonderada(a.getValorAquisicao(), a.getQuantidade(), novaAccao.getValorAquisicao(), novaAccao.getQuantidade()));
				a.setQuantidade(a.getQuantidade() + novaAccao.getQuantidade());
				//				System.out.println(jogador.getAccoes().get(jogador.getAccoes().indexOf(novaAccao)).getQuantidade());
				//				System.out.println(a.getQuantidade());
				Timestamp time = new Timestamp(new java.util.Date().getTime());
				time.setNanos(0);
				System.out.println("Time: " + time + "Stock: " + stock.getSigla() + " Quant:" + quantidade);
				cliente.getJogador().getHistorial().add(new Registo(time, novaAccao.getSigla(), quantidade, novaAccao.getValorAquisicao(), false, seguiuSugestao(stock, false)));
				cliente.getJogador().setSaldo(Utilities.roundTo2DecimalsDouble(cliente.getJogador().getSaldo() - (valor)));
				System.out.println("Operação efectuada com sucesso!");
				return true;
			}
			accoes.add(novaAccao);
			cliente.getJogador().setSaldo(Utilities.roundTo2DecimalsDouble(cliente.getJogador().getSaldo() - (valor)));
			Timestamp time = new Timestamp(new java.util.Date().getTime());
			time.setNanos(0);
			System.out.println("Time: " + time + "Stock: " + stock.getSigla() + " Quant:" + quantidade);
			cliente.getJogador().getHistorial().add(new Registo(time, novaAccao.getSigla(), quantidade, novaAccao.getValorAquisicao(), false, seguiuSugestao(stock, false)));
			System.out.println("Operação efectuada com sucesso!");

			for(Registo r: cliente.getJogador().getHistorial()){
				System.out.println("Registo: " + r);
			}
			return true;
		} 
		System.out.println("Não tem dinheiro suficiente");
		return false;
	}

	public boolean venderAccao(Accao accao, Stock stock, int quantidade) {
		LinkedList<Accao> accoes = cliente.getJogador().getAccoes();
		Boolean vendido = false;
		System.out.println("Tem Acções:" + cliente.getJogador().getAccoes());
		System.out.println("Acção: " + accao);
		if(!accoes.contains(accao)){
			System.out.println("Não possui estas accoes");
			return false;
		}
		
		Iterator<Accao> it = accoes.iterator();
		while(it.hasNext()){
			Accao a = it.next();
			if(a.getSigla().equals(accao.getSigla())){
				System.out.println("Quantidades: " + a.getQuantidade() + " - " + quantidade);
				if(a.getQuantidade() < quantidade){
					System.out.println("Não possui esta quantidade de accoes");
					return false;
				}
				a.setQuantidade(a.getQuantidade() - quantidade);
				Timestamp time = new Timestamp(new java.util.Date().getTime());
				time.setNanos(0);
				cliente.getJogador().getHistorial().add(new Registo(time , accao.getSigla(), quantidade, stock.getCotacao(), true, seguiuSugestao(stock, true)));
				vendido = true;
				if(a.getQuantidade() == 0){
					it.remove();
					cliente.apagarAccao(a);
					System.out.println("Vendeu todas as suas acções desta empresa");
				}
				System.out.println("Operação efectuada com sucesso!");
			}
		}
		cliente.getJogador().setSaldo(Utilities.roundTo2DecimalsDouble(cliente.getJogador().getSaldo() + (stock.getCotacao() * quantidade)));					
		return vendido;
	}
	
	// false = comprar , true = vender
	public TipoSugestao seguiuSugestao(Stock stock, boolean comprar_vender){
//		TipoSugestao tiposugestao = TipoSugestao.NENHUM;
		for(Sugestao s : AgenteVirtual.sugestoes){
			if(s.getStock().getSigla() == stock.getSigla()){
				if(comprar_vender == false){
					if(s.getTiposugestao() == TipoSugestao.COMPRA_ANALISTA || s.getTiposugestao() == TipoSugestao.VOLUME_ANALISTA 
							|| s.getTiposugestao() == TipoSugestao.COMPRA_VIGARISTA || s.getTiposugestao() == TipoSugestao.OSDOIS_COMPRA){
						return s.getTiposugestao();
					}
				}else{
					if(s.getTiposugestao() == TipoSugestao.VENDA_ANALISTA || s.getTiposugestao() == TipoSugestao.VENDA_VIGARISTA || 
							s.getTiposugestao() == TipoSugestao.OSDOIS_VENDA){
						return s.getTiposugestao();
					}
				}
			}else{
				return TipoSugestao.NENHUM;
			}
		}
		return null;
	}

	public boolean temAccao(Accao accao){
		LinkedList<Accao> accoes = cliente.getJogador().getAccoes();
		
		if(!accoes.contains(accao)){
			System.out.println("Não possui estas accoes");
			return false;
		}
		return true;
	}

	public boolean temMaisAccoes(Accao accao, int quantidade){
		//LinkedList<Accao> accoes = jogador.getAccoes();
		if(accao.getQuantidade() >= quantidade ){
			System.out.println("Possui este numero de accoes");
			return true;
		}
		return false;
	}
}

